/*!
 * \file UftStraContext.cpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief UFT策略上下文实现文件
 * 
 * \details 实现UFT策略上下文的所有功能，包括策略回调事件的分发、
 *          市场数据处理、交易事件处理等核心功能。作为策略与引擎之间的桥梁。
 */
#include "UftStraContext.h"
#include "../Includes/UftStrategyDefs.h"

/*!
 * \brief 构造函数实现
 * \param engine UFT引擎指针
 * \param name 策略上下文名称
 * 
 * \details 初始化UFT策略上下文，继承基类UftStraBaseCtx的初始化，
 *          并将策略实例指针初始化为NULL
 */
UftStraContext::UftStraContext(WtUftEngine* engine, const char* name)
	: UftStraBaseCtx(engine, name)
	, _strategy(NULL)
{
}

/*!
 * \brief 析构函数实现
 * 
 * \details 清理策略上下文资源。策略实例的生命周期由策略管理器管理，
 *          此处不需要显式释放策略实例
 */
UftStraContext::~UftStraContext()
{
}

/*!
 * \brief 策略初始化回调实现
 * 
 * \details 策略初始化处理流程：
 *          1. 调用基类的初始化方法，完成基础设施初始化
 *          2. 如果策略实例存在，调用策略的on_init方法
 *          
 * \note 这是策略生命周期的起点，用于策略的初始化工作
 */
void UftStraContext::on_init()
{
	UftStraBaseCtx::on_init();

	if (_strategy)
		_strategy->on_init(this);
}

/*!
 * \brief Tick数据回调实现
 * \param stdCode 标准合约代码
 * \param newTick 新的Tick数据
 * 
 * \details Tick数据处理流程：
 *          1. 如果策略实例存在，先转发给策略处理
 *          2. 调用基类方法进行数据缓存和其他处理
 *          
 * \warning 这是高频交易的关键路径，需要保证极低延迟
 */
void UftStraContext::on_tick(const char* stdCode, WTSTickData* newTick)
{
	if (_strategy)
		_strategy->on_tick(this, stdCode, newTick);

	UftStraBaseCtx::on_tick(stdCode, newTick);
}

/*!
 * \brief 委托队列数据回调实现
 * \param stdCode 标准合约代码
 * \param newOrdQue 新的委托队列数据
 * 
 * \details 委托队列数据处理流程：
 *          1. 如果策略实例存在，转发给策略进行Level2数据分析
 *          2. 调用基类方法进行数据存储和管理
 *          
 * \note Level2数据用于深度订单簿分析和流动性评估
 */
void UftStraContext::on_order_queue(const char* stdCode, WTSOrdQueData* newOrdQue)
{
	if (_strategy)
		_strategy->on_order_queue(this, stdCode, newOrdQue);

	UftStraBaseCtx::on_order_queue(stdCode, newOrdQue);
}

/*!
 * \brief 委托明细数据回调实现
 * \param stdCode 标准合约代码
 * \param newOrdDtl 新的委托明细数据
 * 
 * \details 委托明细数据处理流程：
 *          1. 如果策略实例存在，转发给策略分析单笔委托行为
 *          2. 调用基类方法进行数据存储和管理
 *          
 * \note 委托明细提供市场参与者的交易意图信息
 */
void UftStraContext::on_order_detail(const char* stdCode, WTSOrdDtlData* newOrdDtl)
{
	if (_strategy)
		_strategy->on_order_detail(this, stdCode, newOrdDtl);

	UftStraBaseCtx::on_order_detail(stdCode, newOrdDtl);
}

/*!
 * \brief 成交明细数据回调实现
 * \param stdCode 标准合约代码
 * \param newTrans 新的成交明细数据
 * 
 * \details 成交明细数据处理流程：
 *          1. 如果策略实例存在，转发给策略分析逐笔成交信息
 *          2. 调用基类方法进行数据存储和管理
 *          
 * \note 成交明细用于分析市场流动性和价格发现
 */
void UftStraContext::on_transaction(const char* stdCode, WTSTransData* newTrans)
{
	if (_strategy)
		_strategy->on_transaction(this, stdCode, newTrans);

	UftStraBaseCtx::on_transaction(stdCode, newTrans);
}

/*!
 * \brief K线数据回调实现
 * \param code 合约代码
 * \param period K线周期
 * \param times 周期倍数
 * \param newBar 新的K线数据
 * 
 * \details K线数据处理流程：
 *          1. 如果策略实例存在，转发给策略进行技术分析
 *          2. 调用基类方法进行K线数据管理
 *          
 * \note 虽然UFT主要基于Tick，但K线可用于趋势判断
 */
void UftStraContext::on_bar(const char* code, const char* period, uint32_t times, WTSBarStruct* newBar)
{
	if (_strategy)
		_strategy->on_bar(this, code, period, times, newBar);

	UftStraBaseCtx::on_bar(code, period, times, newBar);
}

/*!
 * \brief 成交回报回调实现
 * \param localid 本地订单ID
 * \param stdCode 标准合约代码
 * \param isLong 是否多头方向
 * \param offset 开平仓标志
 * \param vol 成交数量
 * \param price 成交价格
 * 
 * \details 成交回报处理流程：
 *          1. 如果策略实例存在，转发给策略更新持仓和风险状态
 *          2. 调用基类方法进行持仓和资金管理
 *          
 * \note 这是交易执行结果的关键反馈，影响策略状态
 */
void UftStraContext::on_trade(uint32_t localid, const char* stdCode, bool isLong, uint32_t offset, double vol, double price)
{
	//const char* innerCode = get_inner_code(stdCode);
	if (_strategy)
		_strategy->on_trade(this, localid, stdCode, isLong, offset, vol, price);

	UftStraBaseCtx::on_trade(localid, stdCode, isLong, offset, vol, price);
}

/*!
 * \brief 订单状态回调实现
 * \param localid 本地订单ID
 * \param stdCode 标准合约代码
 * \param isLong 是否多头方向
 * \param offset 开平仓标志
 * \param totalQty 订单总量
 * \param leftQty 剩余数量
 * \param price 订单价格
 * \param isCanceled 是否已撤销
 * 
 * \details 订单状态处理流程：
 *          1. 如果策略实例存在，转发给策略跟踪订单生命周期
 *          2. 调用基类方法进行订单状态管理
 *          
 * \note 订单状态变化包括部分成交、完全成交、撤单等
 */
void UftStraContext::on_order(uint32_t localid, const char* stdCode, bool isLong, uint32_t offset, double totalQty, double leftQty, double price, bool isCanceled /* = false */)
{
	//const char* innerCode = get_inner_code(stdCode);
	if (_strategy)
		_strategy->on_order(this, localid, stdCode, isLong, offset, totalQty, leftQty, price, isCanceled);

	UftStraBaseCtx::on_order(localid, stdCode, isLong, offset, totalQty, leftQty, price, isCanceled);
}

/*!
 * \brief 交易通道就绪回调实现
 * 
 * \details 交易通道就绪处理流程：
 *          1. 如果策略实例存在，通知策略交易通道已准备就绪
 *          2. 调用基类方法进行通道状态管理
 *          
 * \note 只有通道就绪后，策略才可以进行交易操作
 */
void UftStraContext::on_channel_ready()
{
	if (_strategy)
		_strategy->on_channel_ready(this);

	UftStraBaseCtx::on_channel_ready();
}

/*!
 * \brief 交易通道断开回调实现
 * 
 * \details 交易通道断开处理流程：
 *          1. 如果策略实例存在，通知策略交易通道已断开
 *          2. 调用基类方法进行通道状态管理
 *          
 * \warning 通道断开时策略应停止新的交易操作
 */
void UftStraContext::on_channel_lost()
{
	if (_strategy)
		_strategy->on_channel_lost(this);

	UftStraBaseCtx::on_channel_lost();
}

/*!
 * \brief 订单委托结果回调实现
 * \param localid 本地订单ID
 * \param stdCode 标准合约代码
 * \param bSuccess 委托是否成功
 * \param message 错误信息（如果失败）
 * 
 * \details 委托结果处理流程：
 *          1. 如果策略实例存在，通知策略订单提交结果
 *          2. 调用基类方法进行委托状态管理
 *          
 * \note 委托失败时，message参数包含具体错误信息
 */
void UftStraContext::on_entrust(uint32_t localid, const char* stdCode, bool bSuccess, const char* message)
{
	if (_strategy)
		_strategy->on_entrust(localid, bSuccess, message);

	UftStraBaseCtx::on_entrust(localid, stdCode, bSuccess, message);
}

/*!
 * \brief 持仓变化回调实现
 * \param stdCode 标准合约代码
 * \param isLong 是否多头持仓
 * \param prevol 昨仓数量
 * \param preavail 昨仓可用数量
 * \param newvol 今仓数量
 * \param newavail 今仓可用数量
 * \param tradingday 交易日
 * 
 * \details 持仓变化处理流程：
 *          1. 如果策略实例存在，通知策略持仓状态变化
 *          2. 调用基类方法进行持仓管理
 *          
 * \note 区分今仓和昨仓，支持精确的仓位管理
 */
void UftStraContext::on_position(const char* stdCode, bool isLong, double prevol, double preavail, double newvol, double newavail, uint32_t tradingday)
{
	if (_strategy)
		_strategy->on_position(this, stdCode, isLong, prevol, preavail, newvol, newavail);

	UftStraBaseCtx::on_position(stdCode, isLong, prevol, preavail, newvol, newavail, tradingday);
}

/*!
 * \brief 交易时段开始回调实现
 * \param uTDate 交易日期
 * 
 * \details 时段开始处理流程：
 *          - 如果策略实例存在，通知策略交易时段开始
 *          
 * \note 策略可以在此时进行交易前的准备工作
 */
void UftStraContext::on_session_begin(uint32_t uTDate)
{
	if (_strategy)
		_strategy->on_session_begin(this, uTDate);
}

/*!
 * \brief 交易时段结束回调实现
 * \param uTDate 交易日期
 * 
 * \details 时段结束处理流程：
 *          - 如果策略实例存在，通知策略交易时段结束
 *          
 * \note 策略可以在此时进行清理和统计工作
 */
void UftStraContext::on_session_end(uint32_t uTDate)
{
	if (_strategy)
		_strategy->on_session_end(this, uTDate);
}